package com.heima.bean;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.io.FileFilter;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

@Data
public class Employee implements Serializable , UserDetails {

    private static final long serialVersionUID = 1L;

    /*
        1. 如果希望Jackson 在转换某一个属性的时候，转化成指定的类型，那么可以在属性上打注解
            1.1 @JsonSerialize 标记着怎么样做转化
            1.2 using, 就是用于指定使用哪一种序列化器。
     */
    //@JsonSerialize(using = ToStringSerializer.class)
    private Long id;

    private String username;

    private String name;

    private String password;

    private String phone;

    private String sex;

    private String idNumber;

    private Integer status;

    // ================ 以下4个字段属于公共字段，在很多张表里面都有这几个属性。==================
    // 我们希望mybatisplus 能在添加  或者 更新的时候，为我们自动赋值这几个属性。
    // 1.  mybatisplus 需要知道在什么情况下给属性赋值， 需要在属性上面打注解，告诉mybatisplus.
    // 2.  mybatisplus 怎么知道要给这几个属性赋什么值呢？ 还需要提供一个类告诉它。

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;   //添加的时候赋值

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;   //添加、更新的时候赋值

    @TableField(fill = FieldFill.INSERT)
    private Long createUser;            //添加的时候赋值

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;            //添加、更新的时候赋值

    //表示这个员工属于什么角色
    @TableField(exist = false)
    private List<Role> roleList = new ArrayList<>();

    //账号的角色是什么
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {//返回的是一个用户的权限的集合
        List<SimpleGrantedAuthority> list = new ArrayList<>();
        for (Role role : roleList) {
            list.add(new SimpleGrantedAuthority(role.getKeyword()));
        }
        return list;
    }

    //账号是否没有过期！
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    // 账号是否没有被锁定
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    // 认证信息 是否没有过期
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    //表示这个员工的账号是否可用！
    @Override
    public boolean isEnabled() {
        return true;
    }

}
